// 进行导航守卫,守卫路由跳转
import router from '@/router'

import store from '@/store'
import nProgress from 'nprogress'
import 'nprogress/nprogress.css'

const whiteList = ['/login', '/404']

// 前守卫
// to 到哪里去  from从哪里来  next必须执行的回调函数
router.beforeEach(async(to, from, next) => {
  nProgress.start() // 开启进度条
  // 判断有么有token
  // debugger
  // console.log(store.getters.token)
  if (store.getters.token) {
    // 有token
    if (to.path === '/login') {
      // 判断是否去的是登录页 如果是登录  => 跳转到主页

      next('/') // 跳转到主页
      nProgress.done()
    } else {
      // 判断是否获取过资料  如果有userId表示已经获取过了  没有id表示没有获取过
      if (!store.getters.userId) {
        // 没有id  获取用户资料
        // 调用action
        const { roles } = await store.dispatch('user/getUserInfo') // 调用获取用户资料的aciton
        console.log(roles.menus)
        // 筛选路由  接收routes
        const routes = await store.dispatch('permission/filterRoutes', roles.menus)
        // routes 就是我们要动态添加的路由
        router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])// 添加动态路由
        // addRoutes 之后 需要多加一次跳转,才可以生效,不能直接next
        // 两种方式,直接传一个地址(跳到地址),  第二种:定义一个对象,to到对象
        next(to.path)
        // 注意:promise 是异步操作
        // 应该强制等待promise进行resolve
        // 如果不写else 会继续执行
      } else {
        // 不是登录页
        next()
      }
    }
  } else {
  // 没有token
  // 判断是否在白名单
    if (whiteList.indexOf(to.path) > -1) {
      // 在白名单里面
      next()
    } else {
      // 不在白名单
      next('/login')
      // 手动关闭进度条
      nProgress.done()
    }
  }
})

// 后守卫
router.afterEach(() => nProgress.done())
